package com.edu.interceptor;


import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.handler.Handler;
import java.util.Date;

public class MyInterceptor implements HandlerInterceptor {

    /**
     *
     * @param request  请求对象
     * @param response  相应对象
     * @param handler  求代表被拦截到的那个Controller
     * @return
     *  true 代表 controller里的方法正常放行执行
     *  false 不放行
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        System.out.println("执行时间:"+new Date());
        System.out.println("执行了 拦截器的 前置处理");
        HandlerMethod hm = (HandlerMethod) handler;
        System.out.println(hm.getBeanType().getName());
        System.out.println(hm.getMethod().getName());

//        request.getRequestDispatcher("/index2.jsp").forward(request,response);
        return true;
    }

    /**
     * 后置处理 在handler方法执行完毕之后，页面跳转之前执行，如果handler方法报错，则不执行，
     * 可以在后置方法中 修改 ModelAndView 即修改最终页面和数据。
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行了拦截器的 后置处理");
//        modelAndView.setViewName("forward:/index3.jsp");
        modelAndView.addObject("msg","经过了后置处理添加的数据");
    }

    /**
     * 最终处理 不管handler的方法执行 是否报错都会执行，可以接受大业务方法中的异常对象
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("执行了 最终处理");
        if(ex != null){
            request.getRequestDispatcher("/error.jsp").forward(request,response);
        }
    }
}
